package com.c.opt;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.PageResult;
import cn.hutool.json.JSONObject;
import com.c.opt.query.ComOptQueryWrapper;
import lombok.SneakyThrows;
import ntd.util.frame.data.bo.MetaTableField;
import ntd.util.frame.data.tool.ToolMysql;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

public interface ComOptInterface<T> {

    /**
     * 获取表名称
     * @return
     */
    String tName();

    /**
     * 配置 java bean 对象
     * @param beanClass
     * @return
     */
    ComOpt<T> bean(Class<T> beanClass);

    /**
     * 获取数据源
     * @return
     */
    DataSource ds();

    /**
     * 简单数据操作对象
     * @return
     */
    Db db();

    /**
     * mysql 特殊操作对象
     * @return
     */
    ToolMysql toolMysql();

    /**
     * 表信息 - 元数据
     * @return
     */
    List<MetaTableField> tableInfo();

    /**
     * 列表查询
     * @param comOptQueryWrapper
     * @return
     */
    List<Entity> list(ComOptQueryWrapper comOptQueryWrapper);

    /**
     * 列表查询 - bean
     * @param comOptQueryWrapper
     * @return
     */
    List<T> listBean(ComOptQueryWrapper comOptQueryWrapper);

    /**
     * 对象查询 - 单个
     * @param comOptQueryWrapper
     * @return
     */
    Entity get(ComOptQueryWrapper comOptQueryWrapper);

    /**
     * 对象bean查询 - 单个
     * @param comOptQueryWrapper
     * @return
     */
    T getBean(ComOptQueryWrapper comOptQueryWrapper);

    /**
     * 根据id获取对象
     * @param id
     * @return
     */
    Entity getById(String id);

    /**
     * 根据id获取bean
     * @param id
     * @return
     */
    T getBeanById(String id);

    /**
     * 数量查询
     * @param comOptQueryWrapper
     * @return
     */
    Integer count(ComOptQueryWrapper comOptQueryWrapper);

    /**
     * 分月查询
     * @param comOptQueryWrapper
     * @param page
     * @param size
     * @return
     */
    PageResult<Entity> page(ComOptQueryWrapper comOptQueryWrapper, Integer page, Integer size);

    /**
     * 分页查询 - bean
     * @param comOptQueryWrapper
     * @param page
     * @param size
     * @return
     */
    PageResult<T> pageBean(ComOptQueryWrapper comOptQueryWrapper, Integer page, Integer size);

    /**
     * 根据id删除
     * @param id
     * @return
     */
    boolean removeById(String id);

    /**
     * 对象bean数据同步 - 如果id为空则插入新数据
     * @param t
     * @return
     */
    String syncBean(T t);

    /**
     * 对象bean数据同步
     * @param t
     * @param where
     * @return
     */
    int syncBean(T t, Entity where);

    /**
     * 对象数据同步 - 如果id为空则插入新数据
     * @param entity
     * @return
     */
    String syncEntity(Entity entity);

    /**
     * 数据同步 - 根据条件更新
     * @param entity
     * @param where
     * @return
     */
    int syncEntity(Entity entity, Entity where);

    /**
     * 对象数据同步
     * @param syncData
     * @return
     */
    String sync(Map<String, Object> syncData);

    /**
     * 构建链式调用对象
     * @return
     */
    ComChainOpt<T> query();

    /**
     * 构建条件对象
     * @return
     */
    ComOptQueryWrapper queryWrapper();

    /**
     * 根据条件更新对象
     * @param syncData
     * @param where
     * @return
     */
    
    int sync(JSONObject syncData, Entity where);
}
